#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
实时流式ASR示例
边说边识别

使用方法:
    python realtime_streaming_example.py
    
说明:
    1. 启动后会自动开始监听麦克风
    2. 直接对着麦克风说话，会实时显示识别结果
    3. 按 Ctrl+C 停止识别
"""

import sys
import os
import asyncio

# 添加项目根目录到路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from services.streaming_asr_service import RealTimeStreamingASR


class SimpleStreamingASRDemo:
    """简单的流式ASR演示"""
    
    def __init__(self):
        """初始化"""
        print("🎙️ 实时流式语音识别系统")
        print("=" * 60)
        
        # 创建实时流式ASR实例
        self.asr = RealTimeStreamingASR(
            appid="1871057448",
            token="tnph6TBEuRv4MWgh425-XUf6K7AcS2_5",
            cluster="volcengine_streaming_common",
            sample_rate=16000,
            channels=1,
            chunk_size=3200  # 0.2秒的音频数据
        )
        
        # 识别结果累积
        self.current_text = ""
        self.all_results = []
        
        # 设置回调函数
        self.asr.on_partial_result = self.on_partial_result
        self.asr.on_final_result = self.on_final_result
    
    def on_partial_result(self, text: str, data: dict):
        """
        处理中间识别结果
        中间结果会不断更新，显示当前正在说的话
        """
        self.current_text = text
        # 使用回车覆盖上一行，实现动态更新效果
        print(f"\r💬 正在识别: {text}", end="", flush=True)
    
    def on_final_result(self, text: str, data: dict):
        """
        处理最终识别结果
        当检测到语音段落结束时，会输出最终结果
        """
        print(f"\n✅ 识别完成: {text}")
        print("-" * 60)
        
        # 保存结果
        self.all_results.append(text)
        self.current_text = ""
    
    async def run(self):
        """运行演示"""
        print("\n📋 可用音频设备:")
        self.asr.list_audio_devices()
        
        print("\n" + "=" * 60)
        print("🎤 开始实时识别...")
        print("💡 提示:")
        print("   - 直接对着麦克风说话")
        print("   - 说话时会显示实时识别结果")
        print("   - 停顿2秒后会输出最终结果")
        print("   - 按 Ctrl+C 退出")
        print("=" * 60)
        print()
        
        try:
            # 开始识别
            await self.asr.start()
        except KeyboardInterrupt:
            print("\n\n⚠️ 用户中断")
        except Exception as e:
            print(f"\n\n❌ 发生错误: {e}")
        finally:
            # 停止识别
            await self.asr.stop()
            
            # 显示总结
            self.show_summary()
    
    def show_summary(self):
        """显示识别总结"""
        print("\n" + "=" * 60)
        print("📊 识别总结")
        print("=" * 60)
        
        if self.all_results:
            print(f"\n共识别 {len(self.all_results)} 段语音:\n")
            for i, text in enumerate(self.all_results, 1):
                print(f"  [{i}] {text}")
            
            # 合并所有文本
            full_text = " ".join(self.all_results)
            print(f"\n📝 完整文本:\n{full_text}")
        else:
            print("\n未识别到任何语音")
        
        print("\n" + "=" * 60)
        print("👋 感谢使用！")


async def main():
    """主函数"""
    # 创建并运行演示
    demo = SimpleStreamingASRDemo()
    await demo.run()


if __name__ == "__main__":
    try:
        # 运行异步主函数
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\n\n👋 程序已退出")
    except Exception as e:
        print(f"\n\n❌ 程序异常: {e}")
        import traceback
        traceback.print_exc()

